package com.lyf.shop.web.controller;

import com.lyf.shop.common.Const;
import com.lyf.shop.entity.User;
import com.lyf.shop.services.Impl.UserServiceImpl;
import com.lyf.shop.services.UserService;
import com.lyf.shop.util.Base64Utils;
import com.lyf.shop.util.EmailUtils;
import com.lyf.shop.util.MD5Utils;
import com.lyf.shop.util.RandomUtils;
import org.apache.commons.beanutils.BeanUtils;
import sun.nio.cs.US_ASCII;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.Map;
import java.util.Random;

@WebServlet(name = "UserServlet",value = "/user")
public class UserController extends BaseController {
    private UserService userService = new UserServiceImpl();

    /**
     * 注销
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String logout(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
        //清除session中的登录信息
        request.getSession().removeAttribute("login_user");
        //清除cookie保存的信息
        Cookie cookie = new Cookie(Const.UserConst.AUTO_LOGIN,"");
        cookie.setPath("/");
        cookie.setMaxAge(0);//设置清空，为了防止出现属性错误问题或残留问题
        response.addCookie(cookie);
        return Const.REDIRECT+"/index.jsp";
    }


    /**
     * 登录
     * 自动登录
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
   public String login(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
       String auto = request.getParameter("auto");//获取用户是否选择了自动登录
       String username = request.getParameter("username");
       String password = request.getParameter("password");
       //
       User user = userService.findUserByUname(username);
       if(user==null){
           request.setAttribute("msg","用户不存在");
           return Const.FORWARD+"/login.jsp";
       }
       if(!user.getUpassword().equals(MD5Utils.md5(password))){
           request.setAttribute("msg","用户名或密码有误");
           return Const.FORWARD+"/login.jsp";
       }
       request.getSession().setAttribute("login_user",user);
       //设置自动登录
       if(auto!=null){
           System.out.println("设置了自动保存两周");
           //保存用户名和密码，都要进行加密base64，转为字符串进行保存
           //
           String value = user.getUname()+Const.COLON+user.getUpassword();
           //加密
           value = Base64Utils.encode(value);
           Cookie cookie = new Cookie(Const.UserConst.AUTO_LOGIN,value);
           cookie.setPath("/");
           cookie.setMaxAge(60*60*24*14);//设置清空，为了防止出现属性错误问题或残留问题
           response.addCookie(cookie);
       }
       return Const.REDIRECT+"/index.jsp";
   }


    //邮箱激活用户的方法
    public String activate(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        String e = request.getParameter("e");
        String c = request.getParameter("c");
        String email = Base64Utils.decode(e);
        String code = Base64Utils.decode(c);
        int i = userService.activeUser(email,code);
        String msg = "激活失败";
        if(i==1){
            msg="激活成功";
        }else if(i==2){
            msg="已经激活，无需再激活";
        }else {
            msg="激活失败";
        }

        request.setAttribute("msg",msg);

        return Const.FORWARD+"/message.jsp";
    }



    /**
     * 注册方法
     * 1.获取用户传递参数
     * 1.1使用BeanUtils.populate(u,parameterMap); 来帮助数据封装,
     *      需要2个条件:1.前端表单里面的name值必须要和我们实体类的属性的名称一致,2.实体类里面的属性必须要有对应的getset方法
     * 2.手动进行剩余数据的封装如用户状态,用户权限,邮件的激活码手动进行设置
     * 3.用户密码的加密 使用md5进行加密
     * 4.发送业务层进行用户注册
     * 5.给出响应 成功就跳转注册成功页面,失败转发到注册页面给与失败提示
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String register(HttpServletRequest request,HttpServletResponse response){
        //获取数据并进行封装 使用request.getParameterMap();
        //username  password  email usex  //id ustatus0  1  ucode  urole0  1
        //前提条件  前端表单里的name值必须要和我们实体类的属性名称一致
        //实体类里面的属性必须要有对应的getset方法
        //封装数据
        //使用工具类BeanUtils  populate方法

        //需要一个实体类，让工具帮我们进行属性的封装
        User user = new User();
        //通过request获取一个getParameterMap里面是前端提交过来的所有数据
        //key 表单的name值  value 表单对应的value值
        Map<String,String[]> map = request.getParameterMap();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //手动设置其他数据
        //权限
        user.setUrole(Const.UserConst.IS_MUNBER);
        //设置用户状态状态（未激活）
        user.setUstatus(Const.UserConst.HAS_NOT_ACTIVE);
        //唯一的一个激活码
        user.setUcode(RandomUtils.createActive());
        //密码使用MD5加密1
        user.setUpassword(MD5Utils.md5(user.getUpassword()));
        //参数已添加封装或注册
        int i = userService.addUser(user);
        if(i>0){
            //加入邮件的发送
            EmailUtils.sendEmail(user);
            //重定向
            return Const.REDIRECT+"/login.jsp";
        }else {
            //转发
            request.setAttribute("msg","失败");
            return Const.FORWARD+"/register.jsp";
        }
    }


    //验证用户名是否重复AJAX
    public String checkUserName(HttpServletRequest request,HttpServletResponse response){
        //AJAX验证
        //获取数据
        String username = request.getParameter("username");
        User user = userService.findUserByUname(username);
        if (user!=null){
            //如果不为空，则用户已存在，返回1
            return "1";
        }
        return "0";
    }
}
